//路由鉴权
import router from '@/router'

// 引入全局配置文件
import { logoSetting } from './setting'

// 进度条插件 nprogress
//@ts-ignore
import nprogress from 'nprogress'
// 可以进入这个css文件中修改进度条颜色
import 'nprogress/nprogress.css'

// 不显示进度条右侧小圆圈
nprogress.configure({ showSpinner: false })

// 获取Pinia中的token数据，判断用户是否登录
import useUserStore from '@/store/modules/user'

// 你想使用小仓库之前先得使用大仓库
import pinia from './store'

// 这样就可以获取到小仓库中的数据了
let userStore = useUserStore(pinia)

// 全局前置守卫
router.beforeEach(async (to, from, next) => {
  // 修改Dom标题
  document.title = `${logoSetting.logoTitle}-${to.meta.title}`

  nprogress.start()

  let token = userStore.token
  // 获取用户名字
  let username = userStore.username
  if (token) {
    //已登录
    if (to.path == '/login') {
      // 登录成功了就不准重新跳转至登录 强制重定向到首页
      next({ path: '/' })
    } else {
      // 如果有用户信息就直接放行
      if (username) {
        next()
      } else {
        // 没有用户信息在守卫这里重新获取用户信息再放行
        try {
          // 获取用户信息之后放行
          // 由于userInfo 使用了 async修饰符 属于一个Promise函数 返回状态结果只有两个 成功 或 失败
          await userStore.userInfo()
          // 到了这里一定是成功了 然后直接放行
          next()
        } catch (error) {
          // token过期
          // 用户手动修改了本地token
          // token过期需要退出登录 并且将用户数据清空
          await userStore.userLogout()
          // 跳转至login 并带上当前的路由地址 方便用户重新登录直接跳转到该地址
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    //未登录
    if (to.path == '/login') {
      // 如果未登录用户想访问登录页面直接放行
      next()
    } else {
      // 不是跳转到登录的页面不准放行且全部跳转至登录 query 想跳转而没跳转的路由传递在query中存储起来 用于成功后跳转
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})
// 全局后置守卫
router.afterEach((to, from, next) => {
  nprogress.done()
})
